/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import Utilidades.ExibirMensagens;
import Utilidades.VariaveisEstaticas;
import dao.ManterChequeDao;
import dao.ManterCompraDAO;
import dao.ManterFornecedorDAO;
import dao.ManterMateriaPrimaDAO;
import dominio.Cheque;
import dominio.Compra;
import dominio.CompraMateriaprima;
import dominio.CompraMateriaprimaPK;
import dominio.Fornecedor;
import dominio.MateriaPrima;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import negocio.ManterChequeNegocio;
import negocio.ManterCompraMateriaPrimaNegocio;
import negocio.ManterCompraNegocio;
import negocio.ManterFornecedorNegocio;
import negocio.ManterMateriaPrimaNegocio;
//import negocio.ManterMateriaPrimaNegocio;

/**
 *
 * @author Gutto
 */
@ManagedBean
@SessionScoped
public class ManterCompraBean {

    private ManterMateriaPrimaNegocio materiaPrimaNegocio;
    private ManterFornecedorNegocio manterFornecedorNegocio;
    private ManterCompraNegocio manterCompraNegocio;
    private ManterCompraMateriaPrimaNegocio compraMateriaprimaNegocio;
    private ManterChequeNegocio manterChequeNegocio;
    private ManterMateriaPrimaDAO materiaPrimaDAO;
    private ManterFornecedorDAO fornecedorDAO;
    private ManterChequeDao manterChequeDao;
    private MateriaPrima materiaPrima;
    private Fornecedor fornecedor;
    private Compra compra;
    private Cheque cheque;
    private CompraMateriaprimaPK compraMateriaprimaPK;
    private CompraMateriaprima compraMateriaprima;
    private List<MateriaPrima> listaMateriaprima;
    private List<Fornecedor> listaFornecedores;
    private List<CompraMateriaprimaPK> listaCompraMatPrimaPK;
    private List<CompraMateriaprima> listaCompraMatPrima;
    private List<MateriaPrima> listaMateriaprimaAdicionadas;
    private List<Compra> listaCompras;
    private List<List<CompraMateriaprima>> listaComprasMateriaprimasExibidas;
    private List<Cheque> cheques;
    private String listaMatPrimaAdd[][];
    private boolean existeItemAdd;
    private boolean finalizouAdicionar;
    private boolean exibeTabela;
    private boolean mostrarCampoDinheiro;
    private boolean mostrarCampoCheque;
    private String valorTotal;
    private String valorCheque;
    private String valorDindin;
    private String quantidade;
    private String materiaPrimaAdd;
    private String fornecedorAtual;
    private Double valorTParcial;
    private Date dataCompra;
  
    private MateriaPrima materiaprima;

    public ManterCompraBean() {
        inicializarAtributos();
    }





    private void inicializarAtributos() {
        materiaPrimaNegocio = new ManterMateriaPrimaNegocio();
        manterFornecedorNegocio = new ManterFornecedorNegocio();
        manterCompraNegocio = new ManterCompraNegocio();
        materiaPrimaDAO = new ManterMateriaPrimaDAO();
        fornecedorDAO = new ManterFornecedorDAO();
        manterChequeDao = new ManterChequeDao();
        compraMateriaprimaNegocio = new ManterCompraMateriaPrimaNegocio();
        manterChequeNegocio = new ManterChequeNegocio();
        listaFornecedores = new ArrayList<Fornecedor>();
        listaMateriaprima = new ArrayList<MateriaPrima>();        
        listaMateriaprima = materiaPrimaNegocio.findMateriaprimaEntities();
        listaFornecedores = manterFornecedorNegocio.findFornecedorEntities();
        listaMateriaprimaAdicionadas = new ArrayList<MateriaPrima>();
        listaCompraMatPrima = new ArrayList<CompraMateriaprima>();
        listaCompraMatPrimaPK = new ArrayList<CompraMateriaprimaPK>();
        listaMatPrimaAdd = new String[listaMateriaprima.size()][3];
        listaCompras = manterCompraNegocio.findCompraEntities();
        listaComprasMateriaprimasExibidas = new ArrayList<List<CompraMateriaprima>>();
        cheques=new ArrayList<Cheque>();
        materiaPrima = new MateriaPrima();
        fornecedor = new Fornecedor();
        compra = new Compra();
        cheque = new Cheque();


        valorCheque = "";
        valorDindin = "";
        valorTotal = "";
        valorTParcial = 0.0;
        quantidade = "";
        dataCompra = null;
        materiaPrimaAdd = "";
        existeItemAdd = false;
        finalizouAdicionar = true;
        exibeTabela = false;
        mostrarCampoDinheiro = false;
        mostrarCampoCheque = false;
        valorTotal = "";
           

    }

    public void addItemCompra() {
        if (listaMateriaprima == null) {
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(7), new Integer(1), new Integer(1)});
            return;
        }
        double valorParcialMatPrima;
        materiaPrima = materiaPrimaDAO.findMateriaPrima(materiaPrima.getId());
        // Verifica se a matéria prima já foi adicionada
        for (int i = 0; i < listaMateriaprimaAdicionadas.size(); i++) {
            if (listaMateriaprimaAdicionadas.get(i).getId() == materiaPrima.getId()) {
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, null, "MatériaPrima já foi adicionada"));
                //Ta dando erro
                //ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(5), new Integer(1), new Integer(1)});
                return;
            }
        }
        existeItemAdd = true;
        compraMateriaprima = new CompraMateriaprima();
        compraMateriaprimaPK = new CompraMateriaprimaPK();
        fornecedor = fornecedorDAO.findFornecedor(fornecedor.getCodigo());


        listaMateriaprimaAdicionadas.add(materiaPrima);
        listaMatPrimaAdd[listaMateriaprimaAdicionadas.size() - 1][0] = materiaPrima.getNome();
        listaMatPrimaAdd[listaMateriaprimaAdicionadas.size() - 1][1] = quantidade;
        listaMatPrimaAdd[listaMateriaprimaAdicionadas.size() - 1][2] = String.valueOf(materiaPrima.getPreco());

        /*ResourceBundle rb = ResourceBundle.getBundle("aplicacao.Mensagens");
        materiaPrimaAdd = materiaPrimaAdd + materiaPrima.getNome() + rb.getString("QUANTIDADE")
        + " = " + quantidade + rb.getString("VALORTOTALPARCIALMATPRIMA") + "" + valorTParcial;
         */
        //Gambiarra para mostrar as informações das matérias primas que ele add, usa uma matriz
        // de strings onde a primeira coluna é a materia prima, a segunda a quantidade e a ter
        //ceira o preço

        String matPrima;
        int quant;
        double preco;
        fornecedorAtual = fornecedor.getNome();
        
            matPrima = listaMatPrimaAdd[listaMateriaprimaAdicionadas.size() - 1][0];
            quant = Integer.parseInt(listaMatPrimaAdd[listaMateriaprimaAdicionadas.size() - 1][1]);
            preco = Double.parseDouble(listaMatPrimaAdd[listaMateriaprimaAdicionadas.size() - 1][2]);
            valorParcialMatPrima = quant * preco;
            materiaPrimaAdd = materiaPrimaAdd + "Matériaprima: " + matPrima + "; Quantidade: "
                    + quant + " Valor Total = " + valorParcialMatPrima + "\n";
        

        valorTParcial = valorTParcial + Integer.parseInt(quantidade) * materiaPrima.getPreco();

        compraMateriaprimaPK = new CompraMateriaprimaPK();
//        compraMateriaprimaPK.setQuantidade(Integer.parseInt(quantidade));
        compraMateriaprimaPK.setCodMatprima(materiaPrima.getId());
        listaCompraMatPrimaPK.add(compraMateriaprimaPK);

        compraMateriaprima.setMateriaprima(materiaPrima);
        listaCompraMatPrima.add(compraMateriaprima);

             

    }

    public void adicionarCheque(){

        for (Cheque c : cheques) {
            if (cheque.getAgencia() == c.getAgencia() && cheque.getConta().equals(c.getConta()) && cheque.getNumCheque() == c.getNumCheque()) {
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, null, "Cheque já adicionado na compra ou na venda"));
                return;
            }
        }
         manterChequeNegocio.create(cheque);

         for(Cheque c : manterChequeNegocio.findChequeEntities()){
             if(c.getAgencia()==cheque.getAgencia()&& c.getConta()==cheque.getConta() && c.getNumCheque()== cheque.getNumCheque()){
                cheque.setId(c.getId());
             break;
             }
         }

         cheques.add(cheque);
         cheque = new Cheque();


    }

    public void removeItemCompra() {
        
        materiaPrima = materiaPrimaDAO.findMateriaPrima(materiaPrima.getId());
        listaMateriaprimaAdicionadas.remove(materiaPrima);
        for (int i = 0; i < listaCompraMatPrimaPK.size(); i++) {
            if (listaCompraMatPrimaPK.get(i).getCodMatprima() == materiaPrima.getId()) {
                listaCompraMatPrimaPK.remove(i);
            }
            if (listaCompraMatPrima.get(i).getMateriaprima().getId() == materiaPrima.getId()) {
                listaCompraMatPrima.remove(i);
            }
        }
        double valorParcialMatPrima = 0.0;
        String matPrima;
        int quant;
        double preco;
        materiaPrimaAdd = "";
        for (int i = 0; i < listaMateriaprimaAdicionadas.size(); i++) {
            matPrima = listaMatPrimaAdd[i][0];
            quant = Integer.parseInt(listaMatPrimaAdd[i][1]);
            preco = Double.parseDouble(listaMatPrimaAdd[i][2]);
            valorParcialMatPrima = quant * preco;
            materiaPrimaAdd = materiaPrimaAdd + matPrima + " quantidade = "
                    + quant + " valor = " + valorParcialMatPrima + "\n" + fornecedor.getNome()
                    + "\n\n";
        }
        if (listaMateriaprimaAdicionadas.isEmpty()) {
            existeItemAdd = false;
        }
        quantidade = "";
        double valor = valorTParcial;
        valorTParcial = valorTParcial - valorParcialMatPrima;
    }

    public void finalizarAdicionarItens() {
        finalizouAdicionar = true;
    }

    public void adicionarNovosItens() {
        finalizouAdicionar = false;
    }

    public void create() {
        compra.setDataCompra(dataCompra);
        compra.setChequeList(cheques);
        compra.setValorDinheiro(Double.parseDouble(valorDindin));
        compra.setFornecedor(fornecedor);
        
        int resultado = manterCompraNegocio.create(compra);
        switch (resultado) {
            
            case VariaveisEstaticas.ERRO_DUPLICACAO:
              ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(5), new Integer(0), new Integer(0)});
                return;
                
            case VariaveisEstaticas.ERRO_BD:
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(1), new Integer(1), new Integer(1)});
                return;

        }

        compra = new ManterCompraDAO().findCompra(compra.getCodigocompra());

        for (int i = 0; i< listaCompraMatPrimaPK.size(); i++){

            listaCompraMatPrimaPK.get(i).setCodCompra(compra.getCodigocompra());
            listaCompraMatPrima.get(i).setCompraMateriaprimaPK(listaCompraMatPrimaPK.get(i));
            listaCompraMatPrima.get(i).setCompra(compra);

        }
        
        compra.setCompraMateriaprimaList(listaCompraMatPrima);
        int res = manterCompraNegocio.edit(compra);
            switch (res) {
                case VariaveisEstaticas.SUCESSO:
        //         ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(5), new Integer(0)});
                    break;
                case VariaveisEstaticas.ERRO_DUPLICACAO:
       //           ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(5), new Integer(1), new Integer(0)});
                    break;
                case VariaveisEstaticas.ERRO_BD:
     //              ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(1), new Integer(1), new Integer(1)});
                    break;
            }
        inicializarAtributos();

    }

    public void findComprasEntities() {
        exibeTabela = true;
        listaCompras = manterCompraNegocio.findCompraEntities();
        /*for(Compra c: listaCompras){
        listaComprasMateriaprimasExibidas.add(compra.ge));
        }
        listaComprasMateriaprimasExibidas = compra.getCompraMateriaprimaList();*/
    }
  
    public ManterChequeDao getManterChequeDao() {
        return manterChequeDao;
    }

    public void setManterChequeDao(ManterChequeDao manterChequeDao) {
        this.manterChequeDao = manterChequeDao;
    }

    public List<Cheque> getCheques() {
        return cheques;
    }

    public void setCheques(List<Cheque> cheques) {
        this.cheques = cheques;
    }

    public boolean isMostrarCampoDinheiro() {
        return mostrarCampoDinheiro;
    }

    public void setMostrarCampoDinheiro(boolean mostrarCampoDinheiro) {
        this.mostrarCampoDinheiro = mostrarCampoDinheiro;
    }

    
    public boolean isMostrarCampoCheque() {
        return mostrarCampoCheque;
    }

    public void setMostrarCampoCheque(boolean mostrarCampoCheque) {
        this.mostrarCampoCheque = mostrarCampoCheque;
    }
    

    public Cheque getCheque() {
        return cheque;
    }

    public void setCheque(Cheque cheque) {
        this.cheque = cheque;
    }

    public ManterChequeNegocio getManterChequeNegocio() {
        return manterChequeNegocio;
    }

    public void setManterChequeNegocio(ManterChequeNegocio manterChequeNegocio) {
        this.manterChequeNegocio = manterChequeNegocio;
    }

    public List<MateriaPrima> getListaMateriaprima() {
        return listaMateriaprima;
    }

    public void setListaMateriaprima(List<MateriaPrima> listaMateriaprima) {
        this.listaMateriaprima = listaMateriaprima;
    }

    public MateriaPrima getMateriaPrima() {
        return materiaPrima;
    }

    public void setMateriaPrima(MateriaPrima materiaPrima) {
        this.materiaPrima = materiaPrima;
    }

    public String getValorCheque() {
        return valorCheque;
    }

    public void setValorCheque(String valorCheque) {
        this.valorCheque = valorCheque;
    }

    public String getValorDindin() {
        return valorDindin;
    }

    public void setValorDindin(String valorDindin) {
        this.valorDindin = valorDindin;
    }

    public String getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(String valorTotal) {
        this.valorTotal = valorTotal;
    }

    public List<Fornecedor> getListaFornecedores() {
        return listaFornecedores;
    }

    public void setListaFornecedores(List<Fornecedor> listaFornecedores) {
        this.listaFornecedores = listaFornecedores;
    }

    public Fornecedor getFornecedor() {
        return fornecedor;
    }

    public void setFornecedor(Fornecedor fornecedor) {
        this.fornecedor = fornecedor;
    }

    public String getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(String quantidade) {
        this.quantidade = quantidade;
    }

    public Date getDataCompra() {
        return dataCompra;
    }

    public void setDataCompra(Date dataCompra) {
        this.dataCompra = dataCompra;
    }

    public Compra getCompra() {
        return compra;
    }

    public void setCompra(Compra compra) {
        this.compra = compra;
    }

    public CompraMateriaprima getCompraMateriaprima() {
        return compraMateriaprima;
    }

    public void setCompraMateriaprima(CompraMateriaprima compraMateriaprima) {
        this.compraMateriaprima = compraMateriaprima;
    }

    public CompraMateriaprimaPK getCompraMateriaprimaPK() {
        return compraMateriaprimaPK;
    }

    public void setCompraMateriaprimaPK(CompraMateriaprimaPK compraMateriaprimaPK) {
        this.compraMateriaprimaPK = compraMateriaprimaPK;
    }

    public List<CompraMateriaprima> getListaCompraMatPrima() {
        return listaCompraMatPrima;
    }

    public void setListaCompraMatPrima(List<CompraMateriaprima> listaCompraMatPrima) {
        this.listaCompraMatPrima = listaCompraMatPrima;
    }

    public List<CompraMateriaprimaPK> getListaCompraMatPrimaPK() {
        return listaCompraMatPrimaPK;
    }

    public void setListaCompraMatPrimaPK(List<CompraMateriaprimaPK> listaCompraMatPrimaPK) {
        this.listaCompraMatPrimaPK = listaCompraMatPrimaPK;
    }

    public Double getValorTParcial() {
        return valorTParcial;
    }

    public void setValorTParcial(Double valorTParcial) {
        this.valorTParcial = valorTParcial;
    }

    public List<MateriaPrima> getListaMateriaprimaAdicionadas() {
        return listaMateriaprimaAdicionadas;
    }

    public void setListaMateriaprimaAdicionadas(List<MateriaPrima> listaMateriaprimaAdicionadas) {
        this.listaMateriaprimaAdicionadas = listaMateriaprimaAdicionadas;
    }

    public String getMateriaPrimaAdd() {
        return materiaPrimaAdd;
    }

    public void setMateriaPrimaAdd(String materiaPrimaAdd) {
        this.materiaPrimaAdd = materiaPrimaAdd;
    }

    public String[][] getListaMatPrimaAdd() {
        return listaMatPrimaAdd;
    }

    public void setListaMatPrimaAdd(String[][] listaMatPrimaAdd) {
        this.listaMatPrimaAdd = listaMatPrimaAdd;
    }

    public boolean isExisteItemAdd() {
        return existeItemAdd;
    }

    public void setExisteItemAdd(boolean existeItemAdd) {
        this.existeItemAdd = existeItemAdd;
    }

    public boolean isFinalizouAdicionar() {
        return finalizouAdicionar;
    }

    public void setFinalizouAdicionar(boolean finalizouAdicionar) {
        this.finalizouAdicionar = finalizouAdicionar;
    }

    public String getFornecedorAtual() {
        return fornecedorAtual;
    }

    public void setFornecedorAtual(String fornecedorAtual) {
        this.fornecedorAtual = fornecedorAtual;
    }

    public List<Compra> getListaCompras() {
        return listaCompras;
    }

    public void setListaCompras(List<Compra> listaCompras) {
        this.listaCompras = listaCompras;
    }

    public boolean isExibeTabela() {
        return exibeTabela;
    }

    public void setExibeTabela(boolean exibeTabela) {
        this.exibeTabela = exibeTabela;
    }
}
